// #pragma once
// // Model,通常是和数据交互的模块，比如，对题库进行增删查改
// #include <iostream>
// #include <string>
// #include <cassert>
// #include <vector>
// #include <unordered_map>

// #include "../Comm/Log.hpp"
// #include "../Comm/Util.hpp"

// namespace ns_model
// {
//     using namespace ns_Log;
//     using namespace ns_Util;
//     // 创建一个question的结构
//     struct Question
//     {
//         std::string number; // 题目编号
//         std::string title;  // 标题
//         std::string star;   // 题目难度
//         int cpu_limit;      // 时间限制
//         int mem_limit;      // 空间限制
//         std::string desc;   // 题目描述
//         std::string header; // 题目头部(用户能看到的代码部分)
//         std::string tail;   // 题目尾部(测试用例)
//     };

//     // 表示题目文件资源路径
//     const std::string question_list = "./questions/questions.list";
//     const std::string question_path = "./questions/";

//     class Model
//     {
//     private:
//         // 构建题目和题目细节的映射
//         std::unordered_map<std::string, Question> questions;

//     public:
//         Model()
//         {
//             // 在构造函数中使用 assert 的核心用途是：
//             // 在开发阶段强制验证对象初始化所需的关键前提条件，
//             // 确保对象被创建时处于一个合法、可用的状态。
//             assert(LoadQuestionList(question_list));
//         }
//         // 加载配置文件：./Questions/Question.list + 题目编号
//         bool LoadQuestionList(const std::string &question_list)
//         {
//             // 打开题目列表
//             std::ifstream in(question_list);
//             std::cout << "打开文件成功" << std::endl;
//             if (!in.is_open())
//             {
//                 LOG(FATAL) << "加载题库失败，请检查是否存在题库" << "\n";
//                 return false;
//             }
//             // 上述打开文件，存在line中，再进行分割后存在vector容器中
//             std::string line;
//             while (getline(in, line))
//             {
//                 std::vector<std::string> tokens;
//                 std::string sep = " ";
//                 StringUtil::SplitString(line, &tokens, sep);
//                 // 判断分割是否完整
//                 if (tokens.size() != 5)
//                 {
//                     LOG(WARNING) << "加载部分题目失败，请检查题目格式！" << "\n";
//                     return false;
//                 }
//                 // 将拆分的数据放入题目结构体中
//                 Question q;
//                 q.number = tokens[0];
//                 q.title = tokens[1];
//                 q.star = tokens[2];
//                 q.cpu_limit = atoi(tokens[3].c_str());
//                 q.mem_limit = atoi(tokens[4].c_str());
//                 // 拼接路径，加上题目编号找到题目
//                 std::string path = question_path;
//                 path += q.number;
//                 path += "/";

//                 FileUtil::ReadFile(path + "desc.txt", (&q.desc), true);
//                 FileUtil::ReadFile(path + "header.cpp", (&q.header), true);
//                 FileUtil::ReadFile(path + "tail.cpp", (&q.tail), true);
//                 // 将获取的数据插入questions中
//                 questions.insert({q.number, q});
//             }
//             LOG(INFO) << "加载题目成功！" << "\n";
//             in.close();

//             return true;
//         }
//         // 获取所有题目列表
//         bool GetAllQuestions(std::vector<Question> *out)
//         {
//             if (questions.size() == 0)
//             {
//                 LOG(ERROR) << "用户获取题目失败" << "\n";
//                 return false;
//             }
//             for (const auto &q : questions)
//             {
//                 // 将获取的题目放入容器中
//                 out->push_back(q.second);
//             }
//             return true;
//         }
//         // 获取单个题目
//         bool GetOneQuestion(const std::string &number, Question *q)
//         {
//             const auto &iter = questions.find(number);
//             if (iter == questions.end())
//             {
//                 LOG(ERROR) << "用户获取题目失败,题目编号为：" << number << "\n";
//                 return false;
//             }
//             (*q) = iter->second;
//             return true;
//         }
//         ~Model()
//         {
//         }
//     };
// }